#include "DelayQuickParametesSet.h"
#include "ui_DelayQuickParametesSet.h"

/**
 * @brief 构造函数
 * @param pDelayDevice 延迟设备对象指针
 * @param parent 父窗口指针
 */
DelayQuickParametersSet::DelayQuickParametersSet(DelayDevice* pDelayDevice, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DelayQuickParametersSet),
    m_pDelayDevice(pDelayDevice)
{
    ui->setupUi(this);

    // 初始化UI值为设备实际值
    updateUIValues();

    connect(pDelayDevice,&DelayDevice::updateADValue,this,&DelayQuickParametersSet::onUpdateADValue);
    connect(pDelayDevice,&DelayDevice::updateArgs,this,[this](QObject* pSender)
    {
        if(this==pSender)
        {
            return;
        }
        updateUIValues();
    });
}

/**
 * @brief 析构函数
 */
DelayQuickParametersSet::~DelayQuickParametersSet()
{
    delete ui;
}

/**
 * @brief 更新UI值为设备实际值
 * @details 调用initUIValues()方法实现UI值的更新
 */
void DelayQuickParametersSet::updateUIValues()
{
    if (!m_pDelayDevice) {
        return;
    }

    // 从设备获取当前参数值并设置到UI
    // T0延迟和宽度
    ui->dsbT0Delay->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_TIME_T0).toDouble() / 1000.0); // 转换为ns
    ui->dsbT0Width->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_WIDTH_T0).toDouble() / 1000.0); // 转换为ns

    // T1延迟和宽度
    ui->dsbT1Delay->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_TIME_T1).toDouble() / 1000.0); // 转换为ns
    ui->dsbT1Width->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_WIDTH_T1).toDouble() / 1000.0); // 转换为ns

    // T2延迟和宽度
    ui->dsbT2Delay->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_TIME_T2).toDouble() / 1000.0); // 转换为ns
    ui->dsbT2Width->setValue(m_pDelayDevice->getParameter(PRECISE_DELAY_WIDTH_T2).toDouble() / 1000.0); // 转换为ns

    // DA值
    ui->dsbDA1->setValue(m_pDelayDevice->getParameter(DA_VALUE_1).toDouble());
    ui->dsbDA2->setValue(m_pDelayDevice->getParameter(DA_VALUE_2).toDouble());

    // IO_O值
    ui->sbIOO1->setValue(m_pDelayDevice->getParameter(IO_VALUE_1).toInt());
    ui->sbIOO2->setValue(m_pDelayDevice->getParameter(IO_VALUE_2).toInt());

    // AD值（只读，实时更新）
    ui->lblAD1Value->setText(QString::number(m_pDelayDevice->getParameter(AD_VALUE_1).toDouble(), 'f', 1) + "V");
    ui->lblAD2Value->setText(QString::number(m_pDelayDevice->getParameter(AD_VALUE_2).toDouble(), 'f', 1) + "V");
}

/**
 * @brief 收集UI值到参数映射表
 * @return QVariantMap 包含所有UI参数值的映射表
 * @details 将UI控件中的值收集到QVariantMap中，用于设置设备参数
 */
QVariantMap DelayQuickParametersSet::collectUIValues() const
{
    QVariantMap paramsMap;
    
    // T0延迟和宽度
    paramsMap[PRECISE_DELAY_TIME_T0] = ui->dsbT0Delay->value() * 1000.0; // 转换为皮秒
    paramsMap[PRECISE_DELAY_WIDTH_T0] = ui->dsbT0Width->value() * 1000.0; // 转换为皮秒
    
    // T1延迟和宽度
    paramsMap[PRECISE_DELAY_TIME_T1] = ui->dsbT1Delay->value() * 1000.0; // 转换为皮秒
    paramsMap[PRECISE_DELAY_WIDTH_T1] = ui->dsbT1Width->value() * 1000.0; // 转换为皮秒
    
    // T2延迟和宽度
    paramsMap[PRECISE_DELAY_TIME_T2] = ui->dsbT2Delay->value() * 1000.0; // 转换为皮秒
    paramsMap[PRECISE_DELAY_WIDTH_T2] = ui->dsbT2Width->value() * 1000.0; // 转换为皮秒
    
    // DA值
    paramsMap[DA_VALUE_1] = ui->dsbDA1->value();
    paramsMap[DA_VALUE_2] = ui->dsbDA2->value();
    
    // IO_O值
    paramsMap[IO_VALUE_1] = ui->sbIOO1->value();
    paramsMap[IO_VALUE_2] = ui->sbIOO2->value();
    
    return paramsMap;
}

/**
 * @brief 设置按钮点击事件槽函数
 * @details 收集UI值并调用设备类设置参数
 */
void DelayQuickParametersSet::on_btnSet_clicked()
{
    if (!m_pDelayDevice) {
        return;
    }
    
    // 收集UI值到参数映射表
    QVariantMap paramsMap = collectUIValues();
    
    // 调用设备类设置参数
    bool result = m_pDelayDevice->setArgs(paramsMap);
    
    // 输出结果日志
    if (result) {
        writeLog("延迟参数设置成功!",0,true);
    } else {
       writeLog("延迟参数设置失败!",2,false);
    }
}

/**
 * @brief 取消按钮点击事件槽函数
 * @details 将UI恢复到设备的实际值
 */
void DelayQuickParametersSet::on_btnCancel_clicked()
{
    // 将UI恢复到设备实际值
    updateUIValues();
}

/**
 * @brief 更新AD值
 */
void DelayQuickParametersSet::onUpdateADValue()
{
    // AD值（只读，实时更新）
    ui->lblAD1Value->setText(QString::number(m_pDelayDevice->getParameter(AD_VALUE_1).toDouble(), 'f', 1) + "V");
    ui->lblAD2Value->setText(QString::number(m_pDelayDevice->getParameter(AD_VALUE_2).toDouble(), 'f', 1) + "V");
}
